package com.mall.module.system.service;

import com.mall.common.model.PageResult;
import com.mall.module.system.domain.dto.CreateDeptDTO;
import com.mall.module.system.domain.dto.UpdateDeptDTO;
import com.mall.module.system.domain.entity.SysDept;
import com.mall.module.system.domain.vo.CreateDeptVO;
import com.mall.module.system.domain.vo.DeptDetailVO;
import com.mall.module.system.domain.vo.DeptTreeNodeVO;

import java.util.List;

/**
 * 部门服务接口
 */
public interface SysDeptService {
    
    /**
     * 创建部门
     * @param dto 创建部门参数
     * @return 创建结果
     */
    CreateDeptVO createDept(CreateDeptDTO dto);
    
    /**
     * 更新部门信息
     * @param dto 更新部门参数
     * @return 更新结果
     */
    CreateDeptVO updateDept(UpdateDeptDTO dto);
    
    /**
     * 删除部门
     * @param deptId 部门ID
     */
    void deleteDept(Long deptId);
    
    /**
     * 获取部门详情
     * @param deptId 部门ID
     * @return 部门详情
     */
    DeptDetailVO getDeptDetail(Long deptId);
    
    /**
     * 获取部门树形结构
     * @return 部门树形列表
     */
    List<DeptTreeNodeVO> getDeptTree();
    
    /**
     * 根据条件查询部门列表
     * @param dept 查询条件
     * @return 部门列表
     */
    List<SysDept> getDeptList(SysDept dept);
    
    /**
     * 分页查询部门列表
     * @param dept 查询条件
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 分页结果
     */
    PageResult<SysDept> getDeptPage(SysDept dept, Integer pageNum, Integer pageSize);
    
    /**
     * 更新部门状态
     * @param deptId 部门ID
     * @param status 状态
     */
    void updateDeptStatus(Long deptId, Integer status);
    
    /**
     * 更新部门排序
     * @param deptId 部门ID
     * @param orderNum 排序号
     */
    void updateDeptOrder(Long deptId, Integer orderNum);
    
    /**
     * 批量更新部门排序
     * @param deptOrders 部门排序列表
     */
    void batchUpdateDeptOrder(List<SysDept> deptOrders);
    
    /**
     * 检查部门名称是否存在
     * @param name 部门名称
     * @param parentId 父部门ID
     * @param excludeId 排除的部门ID
     * @return 是否存在
     */
    boolean existsByName(String name, Long parentId, Long excludeId);
    
    /**
     * 检查部门编码是否存在
     * @param deptCode 部门编码
     * @param excludeId 排除的部门ID
     * @return 是否存在
     */
    boolean existsByDeptCode(String deptCode, Long excludeId);
    
    /**
     * 获取部门的所有子部门ID
     * @param deptId 部门ID
     * @return 子部门ID列表
     */
    List<Long> getChildDeptIds(Long deptId);
    
    /**
     * 获取部门的层级路径
     * @param deptId 部门ID
     * @return 层级路径
     */
    String getDeptPath(Long deptId);
    
    /**
     * 统计部门下的用户数量
     * @param deptId 部门ID
     * @return 用户数量
     */
    int countUsersByDeptId(Long deptId);
    
    /**
     * 移动部门
     * @param deptId 部门ID
     * @param newParentId 新父部门ID
     */
    void moveDept(Long deptId, Long newParentId);
}
